#ifndef __EVENT_H__
#define __EVENT_H__

#include <stdint.h>

/*
 * @note 依赖项：
    "cbb_bit.h",    位操作 -- 必须
    "cbb_mem.h"     内存管理 -- 可选
*/

// 替换为自己的内存管理头文件 -- 不使用内存管理时可注释掉
#include "cbb_mem.h"
#define EVENT_MALLOC(size)  S_MALLOC(size)

// 不适用内存管理 -- 全局创建事件类
#ifndef EVENT_MALLOC
#define EVENT_MALLOC(size)  NULL
#endif

// 事件处理返回值
typedef enum EVENT_RET{
    EVENT_OK = 0,
    EVENT_ERR,
}EVENT_RET_t;

// 事件回调函数
typedef void (*Event_CB_t)(void* pvArgs);  

// 事件回调函数结构体
typedef struct Event_Callback{
    Event_CB_t pfnCallback;             // 事件回调函数
    void* pvArgs;                       // 事件参数
    struct Event_Callback* pstNext;     // 事件回调链表
}Event_Callback_t;

typedef enum Event_Type{
    EVENT_8 = 0U,
    EVENT_16,
    EVENT_32,
}Event_Type_t;

// 事件结构体
typedef struct Event{
    void* pu32Event;            // 事件来源
    Event_Type_t eType;         // 事件类型
    uint32_t u32BitMap;             // 事件位图
    Event_Callback_t* pstEventCB;   // 事件回调链表
    struct Event* pstNext;          // 事件链表
}Event_t;

/**
 * @brief 事件注册函数
 * @note 该函数用于注册事件，并返回事件句柄
 * @param pu32Event 事件来源
 * @param u16BitMap 事件位图
 * @param u16Offset 事件偏移
 * @return Event_t* 事件句柄
 */
Event_t*
cbb_event_register(void* pu32Event, Event_Type_t eType, uint32_t u32BitMap);

/**
 * @brief 事件连接函数
 * @note 该函数用于连接事件回调函数
 * @param pstEvent 事件句柄
 * @param pfnCallback 事件回调函数
 * @param pvArgs 事件参数
 * @return @see EVENT_RET_t 
 *
 * @note 事件回调函数尽可能简短，避免占用过多资源，避免阻塞事件处理
 */
EVENT_RET_t 
cbb_event_connect(Event_t* pstEvent, Event_CB_t pfnCallback, void* pvArgs);

/**
 * @brief 事件处理函数
 * @note 该函数用于处理事件 -- 适合多线程，线程内单独处理事件
 * @param pstEvent 事件句柄
 * @return void
 */
void
cbb_event_monitor(Event_t* pstEvent);

/**
 * @brief 事件处理函数
 * @note 该函数由系统调用，用于处理事件 -- 适合单线程，系统调用处理事件
 * @return void
 */
void
cbb_event_run(void);

#endif /* __EVENT_H__ */
